home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / doom / quake_ad.zip / RESPAWN.ZIP / SRC / DEMON.QC next >
Text File  |  1997-03-16  |  12KB  |  405 lines

  1. /*
  2. ==============================================================================
  3.  
  4. DEMON
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. $cd id1/models/demon3
  10. $scale    0.8
  11. $origin 0 0 24
  12. $base base
  13. $skin base
  14.  
  15. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  16. $frame stand10 stand11 stand12 stand13
  17.  
  18. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  19.  
  20. $frame run1 run2 run3 run4 run5 run6
  21.  
  22. $frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9 leap10
  23. $frame leap11 leap12
  24.  
  25. $frame pain1 pain2 pain3 pain4 pain5 pain6
  26.  
  27. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  28.  
  29. $frame attacka1 attacka2 attacka3 attacka4 attacka5 attacka6 attacka7 attacka8
  30. $frame attacka9 attacka10 attacka11 attacka12 attacka13 attacka14 attacka15
  31.  
  32. //============================================================================
  33.  
  34. void()    Demon_JumpTouch;
  35. //--------------------------------------------------------- New Code --------
  36. void()  demon1_die10;
  37. //---------------------------------------------------------------------------
  38.  
  39. void()    demon1_stand1    =[    $stand1,    demon1_stand2    ] {ai_stand();};
  40. void()    demon1_stand2    =[    $stand2,    demon1_stand3    ] {ai_stand();};
  41. void()    demon1_stand3    =[    $stand3,    demon1_stand4    ] {ai_stand();};
  42. void()    demon1_stand4    =[    $stand4,    demon1_stand5    ] {ai_stand();};
  43. void()    demon1_stand5    =[    $stand5,    demon1_stand6    ] {ai_stand();};
  44. void()    demon1_stand6    =[    $stand6,    demon1_stand7    ] {ai_stand();};
  45. void()    demon1_stand7    =[    $stand7,    demon1_stand8    ] {ai_stand();};
  46. void()    demon1_stand8    =[    $stand8,    demon1_stand9    ] {ai_stand();};
  47. void()    demon1_stand9    =[    $stand9,    demon1_stand10    ] {ai_stand();};
  48. void()    demon1_stand10    =[    $stand10,    demon1_stand11    ] {ai_stand();};
  49. void()    demon1_stand11    =[    $stand11,    demon1_stand12    ] {ai_stand();};
  50. void()    demon1_stand12    =[    $stand12,    demon1_stand13    ] {ai_stand();};
  51. void()    demon1_stand13    =[    $stand13,    demon1_stand1    ] {ai_stand();};
  52.  
  53. void()    demon1_walk1    =[    $walk1,        demon1_walk2    ] {
  54. if (random() < 0.2)
  55.     sound (self, CHAN_VOICE, "demon/idle1.wav", 1, ATTN_IDLE);
  56. ai_walk(8);
  57. };
  58. void()    demon1_walk2    =[    $walk2,        demon1_walk3    ] {ai_walk(6);};
  59. void()    demon1_walk3    =[    $walk3,        demon1_walk4    ] {ai_walk(6);};
  60. void()    demon1_walk4    =[    $walk4,        demon1_walk5    ] {ai_walk(7);};
  61. void()    demon1_walk5    =[    $walk5,        demon1_walk6    ] {ai_walk(4);};
  62. void()    demon1_walk6    =[    $walk6,        demon1_walk7    ] {ai_walk(6);};
  63. void()    demon1_walk7    =[    $walk7,        demon1_walk8    ] {ai_walk(10);};
  64. void()    demon1_walk8    =[    $walk8,        demon1_walk1    ] {ai_walk(10);};
  65.  
  66. void()    demon1_run1    =[    $run1,        demon1_run2    ] {
  67. if (random() < 0.2)
  68.     sound (self, CHAN_VOICE, "demon/idle1.wav", 1, ATTN_IDLE);
  69. ai_run(20);};
  70. void()    demon1_run2    =[    $run2,        demon1_run3    ] {ai_run(15);};
  71. void()    demon1_run3    =[    $run3,        demon1_run4    ] {ai_run(36);};
  72. void()    demon1_run4    =[    $run4,        demon1_run5    ] {ai_run(20);};
  73. void()    demon1_run5    =[    $run5,        demon1_run6    ] {ai_run(15);};
  74. void()    demon1_run6    =[    $run6,        demon1_run1    ] {ai_run(36);};
  75.  
  76. void()    demon1_jump1    =[    $leap1,        demon1_jump2    ] {ai_face();};
  77. void()    demon1_jump2    =[    $leap2,        demon1_jump3    ] {ai_face();};
  78. void()    demon1_jump3    =[    $leap3,        demon1_jump4    ] {ai_face();};
  79. void()    demon1_jump4    =[    $leap4,        demon1_jump5    ]
  80. {
  81.     ai_face();
  82.     
  83.     self.touch = Demon_JumpTouch;
  84.     makevectors (self.angles);
  85.     self.origin_z = self.origin_z + 1;
  86.     self.velocity = v_forward * 600 + '0 0 250';
  87.     if (self.flags & FL_ONGROUND)
  88.         self.flags = self.flags - FL_ONGROUND;
  89. };
  90. void()    demon1_jump5    =[    $leap5,        demon1_jump6    ] {};
  91. void()    demon1_jump6    =[    $leap6,        demon1_jump7    ] {};
  92. void()    demon1_jump7    =[    $leap7,        demon1_jump8    ] {};
  93. void()    demon1_jump8    =[     $leap8,        demon1_jump9    ] {};
  94. void()    demon1_jump9    =[     $leap9,        demon1_jump10    ] {};
  95. void()    demon1_jump10    =[     $leap10,    demon1_jump1    ] {
  96. self.nextthink = time + 3;
  97. // if three seconds pass, assume demon is stuck and jump again
  98. };
  99.  
  100. void()    demon1_jump11    =[     $leap11,    demon1_jump12    ] {};
  101. void()    demon1_jump12    =[     $leap12,    demon1_run1    ] {};
  102.  
  103.  
  104. void()    demon1_atta1    =[    $attacka1,        demon1_atta2    ] {ai_charge(4);};
  105. void()    demon1_atta2    =[    $attacka2,        demon1_atta3    ] {ai_charge(0);};
  106. void()    demon1_atta3    =[    $attacka3,        demon1_atta4    ] {ai_charge(0);};
  107. void()    demon1_atta4    =[    $attacka4,        demon1_atta5    ] {ai_charge(1);};
  108. void()    demon1_atta5    =[    $attacka5,        demon1_atta6    ] {ai_charge(2); Demon_Melee(200);};
  109. void()    demon1_atta6    =[    $attacka6,        demon1_atta7    ] {ai_charge(1);};
  110. void()    demon1_atta7    =[    $attacka7,        demon1_atta8    ] {ai_charge(6);};
  111. void()    demon1_atta8    =[    $attacka8,        demon1_atta9    ] {ai_charge(8);};
  112. void()    demon1_atta9    =[    $attacka9,        demon1_atta10] {ai_charge(4);};
  113. void()    demon1_atta10    =[    $attacka10,        demon1_atta11] {ai_charge(2);};
  114. void()    demon1_atta11    =[    $attacka11,        demon1_atta12] {Demon_Melee(-200);};
  115. void()    demon1_atta12    =[    $attacka12,        demon1_atta13] {ai_charge(5);};
  116. void()    demon1_atta13    =[    $attacka13,        demon1_atta14] {ai_charge(8);};
  117. void()    demon1_atta14    =[    $attacka14,        demon1_atta15] {ai_charge(4);};
  118. void()    demon1_atta15    =[    $attacka15,        demon1_run1] {ai_charge(4);};
  119.  
  120. void()    demon1_pain1    =[    $pain1,        demon1_pain2    ] {};
  121. void()    demon1_pain2    =[    $pain2,        demon1_pain3    ] {};
  122. void()    demon1_pain3    =[    $pain3,        demon1_pain4    ] {};
  123. void()    demon1_pain4    =[    $pain4,        demon1_pain5    ] {};
  124. void()    demon1_pain5    =[    $pain5,        demon1_pain6    ] {};
  125. void()    demon1_pain6    =[    $pain6,        demon1_run1    ] {};
  126.  
  127. void(entity attacker, float damage)    demon1_pain =
  128. {
  129.     if (self.touch == Demon_JumpTouch)
  130.         return;
  131.  
  132.     if (self.pain_finished > time)
  133.         return;
  134.  
  135.     self.pain_finished = time + 1;
  136.     sound (self, CHAN_VOICE, "demon/dpain1.wav", 1, ATTN_NORM);
  137.  
  138.     if (random()*200 > damage)
  139.         return;        // didn't flinch
  140.         
  141.     demon1_pain1 ();
  142. };
  143.  
  144. //--------------------------------------------------------- New Code --------
  145. //  The fiend comes back to life.  It gets up on its feet!
  146. //---------------------------------------------------------------------------
  147. void()  demon1_revive1  =[      $death9,        demon1_revive3  ]
  148. {       self.nextthink = self.nextthink + PM_SleepTime();
  149.         self.health = 0;
  150. };
  151. void()  demon1_revive2  =[      $death9,        demon1_revive3  ]
  152. {       self.nextthink = self.nextthink + 5;    };
  153. void()  demon1_revive3  =[      $death9,        demon1_revive4  ]
  154. {       // see if ok to stand up
  155.         self.health = 300;
  156.         sound (self, CHAN_VOICE, "demon/idle1.wav", 1, ATTN_IDLE);
  157.         self.solid = SOLID_SLIDEBOX;
  158.         if (!walkmove (0, 0))
  159.         {       self.think = demon1_revive2;
  160.                 self.solid = SOLID_NOT;
  161.                 return;
  162.         }
  163. };
  164. void()  demon1_revive4  =[      $death8,        demon1_revive5  ] {};
  165. void()  demon1_revive5  =[      $death7,        demon1_revive6  ] {};
  166. void()  demon1_revive6  =[      $death6,        demon1_revive7  ] {};
  167. void()  demon1_revive7  =[      $death5,        demon1_revive8  ] {};
  168. void()  demon1_revive8  =[      $death4,        demon1_revive9  ] {ai_painforward(8);};
  169. void()  demon1_revive9  =[      $death3,        demon1_revive10 ] {ai_painforward(8);};
  170. void()  demon1_revive10 =[      $death2,        demon1_revive11 ] {ai_painforward(8);};
  171. void()  demon1_revive11 =[      $death1,        demon1_revive12 ] {ai_painforward(4);};
  172. void()  demon1_revive12 =[      $attacka1,      demon1_run1 ]
  173. {       self.takedamage = DAMAGE_AIM;   };
  174. //---------------------------------------------------------------------------
  175.  
  176. void()    demon1_die1        =[    $death1,        demon1_die2    ] {
  177. sound (self, CHAN_VOICE, "demon/ddeath.wav", 1, ATTN_NORM);};
  178. void()    demon1_die2        =[    $death2,        demon1_die3    ] {};
  179. void()    demon1_die3        =[    $death3,        demon1_die4    ] {};
  180. void()    demon1_die4        =[    $death4,        demon1_die5    ] {};
  181. void()    demon1_die5        =[    $death5,        demon1_die6    ] {};
  182. void()    demon1_die6        =[    $death6,        demon1_die7    ]
  183. {self.solid = SOLID_NOT;};
  184. void()    demon1_die7        =[    $death7,        demon1_die8    ] {};
  185. void()    demon1_die8        =[    $death8,        demon1_die9    ] {};
  186. //--------------------------------------------------------- Code Change -----
  187. void()  demon1_die9 =
  188. {       if (PM_Revive())  demon1_revive1();
  189.         else  demon1_die10();
  190. };
  191. void()  demon1_die10            =[      $death9,                demon1_die9    ] {};
  192. //---------------------------------------------------------------------------
  193.  
  194. void() demon_die =
  195. {
  196. // check for gib
  197.     if (self.health < -80)
  198.     {
  199.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  200.         ThrowHead ("progs/h_demon.mdl", self.health);
  201.         ThrowGib ("progs/gib1.mdl", self.health);
  202.         ThrowGib ("progs/gib1.mdl", self.health);
  203.         ThrowGib ("progs/gib1.mdl", self.health);
  204.         return;
  205.     }
  206.  
  207. // regular death
  208.     demon1_die1 ();
  209. };
  210.  
  211.  
  212. void() Demon_MeleeAttack =
  213. {
  214.     demon1_atta1 ();
  215. };
  216.  
  217.  
  218. /*QUAKED monster_demon1 (1 0 0) (-32 -32 -24) (32 32 64) Ambush
  219.  
  220. */
  221. void() monster_demon1 =
  222. {
  223.     if (deathmatch)
  224.     {
  225.         remove(self);
  226.         return;
  227.     }
  228.     precache_model ("progs/demon.mdl");
  229.     precache_model ("progs/h_demon.mdl");
  230.  
  231.     precache_sound ("demon/ddeath.wav");
  232.     precache_sound ("demon/dhit2.wav");
  233.     precache_sound ("demon/djump.wav");
  234.     precache_sound ("demon/dpain1.wav");
  235.     precache_sound ("demon/idle1.wav");
  236.     precache_sound ("demon/sight2.wav");
  237.  
  238.     self.solid = SOLID_SLIDEBOX;
  239.     self.movetype = MOVETYPE_STEP;
  240.  
  241.     setmodel (self, "progs/demon.mdl");
  242.  
  243.     setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX);
  244.     self.health = 300;
  245.  
  246.     self.th_stand = demon1_stand1;
  247.     self.th_walk = demon1_walk1;
  248.     self.th_run = demon1_run1;
  249.     self.th_die = demon_die;
  250.     self.th_melee = Demon_MeleeAttack;        // one of two attacks
  251.     self.th_missile = demon1_jump1;            // jump attack
  252.     self.th_pain = demon1_pain;
  253.         
  254.     walkmonster_start();
  255. };
  256.  
  257.  
  258. /*
  259. ==============================================================================
  260.  
  261. DEMON
  262.  
  263. ==============================================================================
  264. */
  265.  
  266. /*
  267. ==============
  268. CheckDemonMelee
  269.  
  270. Returns TRUE if a melee attack would hit right now
  271. ==============
  272. */
  273. float()    CheckDemonMelee =
  274. {
  275.     if (enemy_range == RANGE_MELEE)
  276.     {    // FIXME: check canreach
  277.         self.attack_state = AS_MELEE;
  278.         return TRUE;
  279.     }
  280.     return FALSE;
  281. };
  282.  
  283. /*
  284. ==============
  285. CheckDemonJump
  286.  
  287. ==============
  288. */
  289. float()    CheckDemonJump =
  290. {
  291.     local    vector    dist;
  292.     local    float    d;
  293.  
  294.     if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z
  295.     + 0.75 * self.enemy.size_z)
  296.         return FALSE;
  297.         
  298.     if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z
  299.     + 0.25 * self.enemy.size_z)
  300.         return FALSE;
  301.         
  302.     dist = self.enemy.origin - self.origin;
  303.     dist_z = 0;
  304.     
  305.     d = vlen(dist);
  306.     
  307.     if (d < 100)
  308.         return FALSE;
  309.         
  310.     if (d > 200)
  311.     {
  312.         if (random() < 0.9)
  313.             return FALSE;
  314.     }
  315.         
  316.     return TRUE;
  317. };
  318.  
  319. float()    DemonCheckAttack =
  320. {
  321.     local    vector    vec;
  322.     
  323. // if close enough for slashing, go for it
  324.     if (CheckDemonMelee ())
  325.     {
  326.         self.attack_state = AS_MELEE;
  327.         return TRUE;
  328.     }
  329.     
  330.     if (CheckDemonJump ())
  331.     {
  332.         self.attack_state = AS_MISSILE;
  333.         sound (self, CHAN_VOICE, "demon/djump.wav", 1, ATTN_NORM);
  334.         return TRUE;
  335.     }
  336.     
  337.     return FALSE;
  338. };
  339.  
  340.  
  341. //===========================================================================
  342.  
  343. void(float side)    Demon_Melee =
  344. {
  345.     local    float    ldmg;
  346.     local vector    delta;
  347.     
  348.     ai_face ();
  349.     walkmove (self.ideal_yaw, 12);    // allow a little closing
  350.  
  351.     delta = self.enemy.origin - self.origin;
  352.  
  353.     if (vlen(delta) > 100)
  354.         return;
  355.     if (!CanDamage (self.enemy, self))
  356.         return;
  357.         
  358.     sound (self, CHAN_WEAPON, "demon/dhit2.wav", 1, ATTN_NORM);
  359.     ldmg = 10 + 5*random();
  360.     T_Damage (self.enemy, self, self, ldmg);    
  361.  
  362.     makevectors (self.angles);
  363.     SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  364. };
  365.  
  366.  
  367. void()    Demon_JumpTouch =
  368. {
  369.     local    float    ldmg;
  370.  
  371.     if (self.health <= 0)
  372.         return;
  373.         
  374.     if (other.takedamage)
  375.     {
  376.         if ( vlen(self.velocity) > 400 )
  377.         {
  378.             ldmg = 40 + 10*random();
  379.             T_Damage (other, self, self, ldmg);    
  380.         }
  381.     }
  382.  
  383.     if (!checkbottom(self))
  384.     {
  385.         if (self.flags & FL_ONGROUND)
  386.         {    // jump randomly to not get hung up
  387. //dprint ("popjump\n");
  388.     self.touch = SUB_Null;
  389.     self.think = demon1_jump1;
  390.     self.nextthink = time + 0.1;
  391.  
  392. //            self.velocity_x = (random() - 0.5) * 600;
  393. //            self.velocity_y = (random() - 0.5) * 600;
  394. //            self.velocity_z = 200;
  395. //            self.flags = self.flags - FL_ONGROUND;
  396.         }
  397.         return;    // not on ground yet
  398.     }
  399.  
  400.     self.touch = SUB_Null;
  401.     self.think = demon1_jump11;
  402.     self.nextthink = time + 0.1;
  403. };
  404.  
  405.